package com.quanfu.advice;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Modifier;

/**
 * 定义四个增强方法，获取目标方法的信息，返回值，异常对象
 *
 * 1.定义方法 - 增强代码
 * 2.使用注解指定对应的位置
 * 3.配置切点表达式选中方法
 * 4.切面和ioc的配置
 * 5.开启aspectj注解的支持
 *
 *
 *
 * TODO:增强方法中获取目标方法信息
 *      1.全部增强方法中，获取目标方法的信息（方法名，参数，访问修饰符，所属的类的信息...）
 *        (JoinPoint joinPoint)
 *        joinPoint 包含目标方法的信息！
 *      2.返回的结果 - @AfterReturning
 *        (Object result) result 接受返回结果
 *        @AfterReturning(value = "execution(* com.quanfu.service.impl.*.*(..))",returning = "形参名即可")
 *      3.异常的信息 - @AfterThrowing
 *        (Throwable t) t 接受异常信息
 *        @AfterThrowing(value = "execution(* com.quanfu.service.impl.*.*(..))", throwing = "形参名即可")
 */
//@Component
//@Aspect
public class MyAdvice {
    // 第一个*表示不考虑返回值和返回修饰符，第二个表示类，第三个表示方法，小括号里表示参数
    @Before("execution(* com.quanfu.service.impl.*.*(..))")
    public void before(JoinPoint joinPoint){

        // 1.获取方法属于的类的信息
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        // 2.获取方法名称
        int modifiers = joinPoint.getSignature().getModifiers(); // 获取访问修饰符，返回int类型
        String string = Modifier.toString(modifiers);
        String name = joinPoint.getSignature().getName(); // 获取方法名
        // 3.获取参数列表
        Object[] args = joinPoint.getArgs(); // 获取目标方法参数


    }
    @AfterReturning(value = "execution(* com.quanfu.service.impl.*.*(..))",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result){
        // 获取返回结果
    }
    @After("execution(* com.quanfu.service.impl.*.*(..))")
    public void after(JoinPoint joinPoint){

    }
    @AfterThrowing(value = "execution(* com.quanfu.service.impl.*.*(..))", throwing = "throwable")
    public void afterThrowing(JoinPoint joinPoint, Throwable throwable){
        // 获取异常信息
    }
}
